#include <stdio.h>
#include <stdlib.h>


struct Tdati{
int msgNumber;
int sensorID;
char *sensorValue;
char *destinationIP;
int anno;
int mese;
int giorno;
int ora;
int minuti;
int secondi;
int deadline;
char *type;
struct Tdati *next;
};

typedef struct Tdati dati_t;


dati_t* insert_order_by_deadline(dati_t *c,dati_t elemento);
dati_t* remove_from_tail(dati_t *c,dati_t* elemento);
void stampa(dati_t *c);
int get_num_elements(dati_t *c);



// -----------------------------------------------------------------------------------------------------------------------------------------------------



dati_t* insert_order_by_deadline(dati_t *c,dati_t elemento){
	dati_t *prec, *current;
	dati_t *nuovo;
	
	nuovo = (dati_t*)malloc(sizeof(dati_t));
    *nuovo = elemento;
	
	//printf("Nuovo deadline... %d\n",nuovo->deadline);
	
	if(c==NULL){
		// caso 1: lista vuoto --> Inserimento in testa
		nuovo->next = c;
		//printf("inserisco in posizione 1...\n");
		return nuovo;

	}else{
		
		if( (nuovo->deadline) < (c->deadline)){
			// caso 2: nuovo->deadline < c->deadline --> Inserimento in testa
			nuovo->next = c;
			//printf("inserisco in posizione 1...ma in seguito a confronto\n");
			return nuovo;
		}
		else{
			//printf("Se sono qui, il pacchetto non deve essere inserito in testa\n");

			//caso 3: Inserimento in posizione successiva alla prima
			prec = c;
			current = c->next;
			while(current!=NULL){
				if( (nuovo->deadline) < (current->deadline) ){
					//qui il confronto è ok!
					prec->next=nuovo;
					nuovo->next=current;
					//printf("Confronto ok! inserisco 'nuovo' tra prec e current!\n");
					return c;
				}
				prec=current;
				current=current->next;
			}
			
			//caso4: se siamo qui vuol dire che devo mettere 'nuovo' in fondo alla lista, NB: prec e' l'ultimo!
			prec->next=nuovo;
			nuovo->next=NULL;
			return c;
		}
	}
	//return c;
}



// -----------------------------------------------------------------------------------------------------------------------------------------------------


dati_t* remove_from_tail(dati_t *c,dati_t* elemento){

	dati_t* prossimo;
	prossimo = c->next;

	if(c==NULL){
		printf("Lista vuota!\n");
		return ;
	}
	else{
		*elemento = *c;
		c=prossimo;
		//printf("Elemento in testa alla coda rimosso con successo!\n");
		return c;
	}
}

// -----------------------------------------------------------------------------------------------------------------------------------------------------

void stampa(dati_t * c){
	
	if(c!=NULL){
		while(c!=NULL){
			printf("\n\nId pacchetto: %d\t",c->msgNumber);
			printf("Sensor id: %d\t",c->sensorID);
			printf("Sensor value: %s\t",c->sensorValue);
			printf("Ip client: %s\t",c->destinationIP);
			printf("Timestamp: [%d,%d,%d,%d,%d,%d]\t",c->anno,c->mese,c->giorno,c->ora,c->minuti,c->secondi);
			printf("Deadline: %d\t",c->deadline);
			printf("Type of msg: %s\n\n",c->type);
			c = c->next;
		}
	}
}

// -----------------------------------------------------------------------------------------------------------------------------------------------------

int get_num_elements(dati_t *c){
	int numElem=0;
	if(c!=NULL){
		while(c!=NULL){
			numElem++;
			c = c->next;
		}
	}
	return numElem;
}
